<?php
namespace app\Api\controller;

use app\BaseController;
use think\facade\Db;
use think\facade\Request;

class RefreshToken extends BaseController
{
    /**
     * 使用Refresh Token获取Access Token
     * @return \think\response\Json
     */
    public function getAccessToken()
    {
        $shop_id= Request::get("shop_id");
        if(empty($shop_id)){
            return json(['code' => 0,'msg' => '缺少shop_id参数']);
        }
        // 获取请求参数
        $grant_type = Request::param('grant_type', 'refresh_token');
        $refresh_token_db = Db::name('shops')->where('id', $shop_id)->field('refresh_token')->find();
        $refresh_token = $refresh_token_db['refresh_token'];
        $scope = Request::param('scope', 'basic'); // 默认值为 'basic'

        // 从数据库获取appKey和appSecret
        $appInfo = Db::name('shops')->where('id',$shop_id)->field('sp_author')->find();
        $appInfo = json_decode($appInfo['sp_author'], true);
        $client_id = $appInfo['appKey'];
        $client_secret = $appInfo['appSecret'];

        // 验证必填参数
        if (empty($grant_type) || empty($refresh_token) || empty($client_id) || empty($client_secret) || empty($scope)) {
            return json(['error' => 'invalid_request', 'error_description' => '缺少必填参数。'], 400);
        }

        // 验证 grant_type
        if ($grant_type !== 'refresh_token') {
            return json(['error' => 'unsupported_grant_type', 'error_description' => 'grant_type 必须是 refresh_token。'], 400);
        }

        // 敦煌网OAuth2.0授权服务的Access Token获取地址
        $oauth_url = 'https://secure.dhgate.com/dop/oauth2/access_token';

        // 构建请求数据
        $data = [
            'grant_type' => $grant_type,
            'refresh_token' => $refresh_token,
            'client_id' => $client_id,
            'client_secret' => $client_secret,
            'scope' => $scope
        ];

        // 初始化cURL会话
        $ch = curl_init();
        // 设置请求URL
        curl_setopt($ch, CURLOPT_URL, $oauth_url);
        // 设置为POST请求
        curl_setopt($ch, CURLOPT_POST, 1);
        // 设置POST请求体，将数组转换为URL编码的字符串
        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
        // 设置cURL操作成功时是否返回结果，而非直接输出
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        // 禁用SSL证书验证（在生产环境中应谨慎使用，建议配置正确的证书）
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        // 禁用SSL主机名验证（在生产环境中应谨慎使用）
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

        // 执行cURL请求并获取响应体
        $body = curl_exec($ch);
        // 获取HTTP状态码
        $statusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

        // 检查cURL请求是否发生错误
        if (curl_errno($ch)) {
            // 获取错误信息
            $error_msg = curl_error($ch);
            // 关闭cURL会话
            curl_close($ch);
            // 返回服务器错误响应
            return json(['error' => 'server_error', 'error_description' => 'cURL请求失败: ' . $error_msg], 500);
        }
        // 关闭cURL会话
        curl_close($ch);

        // 将JSON响应体解码为PHP关联数组
        $response_data = json_decode($body, true);

        // 处理API返回的错误（HTTP状态码大于等于400）
        if ($statusCode >= 400) {
            // 如果响应体是有效的JSON且包含'error'键，则直接返回API的错误信息
            if (json_last_error() === JSON_ERROR_NONE && isset($response_data['error'])) {
                return json($response_data, $statusCode);
            } else {
                // 否则，返回通用的API错误信息，包含状态码和原始响应体
                return json(['error' => 'api_error', 'error_description' => 'API返回错误状态码 ' . $statusCode . '，响应体: ' . $body], $statusCode);
            }
        }

        // 成功保存
        if (isset($response_data['access_token'])) {
            Db::name('shops')->where('id', $shop_id)->update([
                'token' => $response_data['access_token'] ?? '',
                'refresh_token' => $response_data['refresh_token'] ?? ''
            ]);
        }

        return json($response_data, $statusCode);
    }
}